package util;

import java.security.AccessController;
import java.security.PrivilegedAction;

public class SystemPropertyUtil {
    /*
    System.getProperty()方法用于获取Java系统的各种属性，如Java版本、操作系统信息、用户目录等。
    这些属性可以在启动Java时通过-JD选项设置，或者在代码中用System.setProperty()动态修改。
     */
    public static boolean contains(String key) {
        return get(key) != null;
    }

    public static String get(String key) {
        return get(key, null);
    }

    public static void set(String key,String value){
        System.setProperty(key,value);
    }

    public static String get(final String key, String def) {
        ObjectUtil.checkNotNull(key, "key");
        if (key.isEmpty()) {
            throw new IllegalArgumentException("key must not be empty.");
        }

        String value = null;
        try {
            if (System.getSecurityManager() == null) {
                value = System.getProperty(key);
            } else {
                value = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty(key));
            }
        } catch (SecurityException e) {
            System.out.printf("Unable to retrieve a system property '%s:%s'; default values will be used.", key, e.getMessage());
        }

        if (value == null) {
            return def;
        }

        return value;
    }

    public static boolean getBoolean(String key, boolean def) {
        String value = get(key);
        if (value == null) {
            return def;
        }

        value = value.trim().toLowerCase();
        if (value.isEmpty()) {
            return def;
        }

        if ("true".equals(value) || "yes".equals(value) || "1".equals(value)) {
            return true;
        }

        if ("false".equals(value) || "no".equals(value) || "0".equals(value)) {
            return false;
        }

        return def;
    }

    public static int getInt(String key, int def) {
        String value = get(key);
        if (value == null) {
            return def;
        }

        value = value.trim();
        try {
            return Integer.parseInt(value);
        } catch (Exception e) {
            // Ignore
        }

        return def;
    }

    public static long getLong(String key, long def) {
        String value = get(key);
        if (value == null) {
            return def;
        }

        value = value.trim();
        try {
            return Long.parseLong(value);
        } catch (Exception e) {
            // Ignore
        }

        return def;
    }

    public static void main(String[] args) {
        System.out.println( "java版本号："  + System.getProperty( "java.version" ));  // java版本号
        System.out.println( "Java提供商名称："  + System.getProperty( "java.vendor" ));  // Java提供商名称
        System.out.println( "Java提供商网站："  + System.getProperty( "java.vendor.url" ));  // Java提供商网站
        System.out.println( "jre目录："  + System.getProperty( "java.home" ));  // Java，哦，应该是jre目录
        System.out.println( "Java虚拟机规范版本号："  + System.getProperty( "java.vm.specification.version" ));  // Java虚拟机规范版本号
        System.out.println( "Java虚拟机规范提供商："  + System.getProperty( "java.vm.specification.vendor" ));  // Java虚拟机规范提供商
        System.out.println( "Java虚拟机规范名称："  + System.getProperty( "java.vm.specification.name" ));  // Java虚拟机规范名称
        System.out.println( "Java虚拟机版本号："  + System.getProperty( "java.vm.version" ));  // Java虚拟机版本号
        System.out.println( "Java虚拟机提供商："  + System.getProperty( "java.vm.vendor" ));  // Java虚拟机提供商
        System.out.println( "Java虚拟机名称："  + System.getProperty( "java.vm.name" ));  // Java虚拟机名称
        System.out.println( "Java规范版本号："  + System.getProperty( "java.specification.version" ));  // Java规范版本号
        System.out.println( "Java规范提供商："  + System.getProperty( "java.specification.vendor" ));  // Java规范提供商
        System.out.println( "Java规范名称："  + System.getProperty( "java.specification.name" ));  // Java规范名称
        System.out.println( "Java类版本号："  + System.getProperty( "java.class.version" ));  // Java类版本号
        System.out.println( "Java类路径："  + System.getProperty( "java.class.path" ));  // Java类路径
        System.out.println( "Java lib路径："  + System.getProperty( "java.library.path" ));  // Java lib路径
        System.out.println( "Java输入输出临时路径："  + System.getProperty( "java.io.tmpdir" ));  // Java输入输出临时路径
        System.out.println( "Java编译器："  + System.getProperty( "java.compiler" ));  // Java编译器
        System.out.println( "Java执行路径："  + System.getProperty( "java.ext.dirs" ));  // Java执行路径
        System.out.println( "操作系统名称："  + System.getProperty( "os.name" ));  // 操作系统名称
        System.out.println( "操作系统的架构："  + System.getProperty( "os.arch" ));  // 操作系统的架构
        System.out.println( "操作系统版本号："  + System.getProperty( "os.version" ));  // 操作系统版本号
        System.out.println( "文件分隔符："  + System.getProperty( "file.separator" ));  // 文件分隔符
        System.out.println( "路径分隔符："  + System.getProperty( "path.separator" ));  // 路径分隔符
        System.out.println( "直线分隔符："  + System.getProperty( "line.separator" ));  // 直线分隔符
        System.out.println( "操作系统用户名："  + System.getProperty( "user.name" ));  // 用户名
        System.out.println( "操作系统用户的主目录："  + System.getProperty( "user.home" ));  // 用户的主目录
        System.out.println( "当前程序所在目录："  + System.getProperty( "user.dir" ));  // 当前程序所在目录
    }

}
